// 导入Koa模块;koa是一个服务端的web框架(请求与响应)
const Koa = require('koa')

// 创建koa应用程序对象，以便注册诸多的中间件(函数)
const app = new Koa()

app.listen(3000)

// 函数，经过注册的函数才叫中间件
function test() {
    console.log('hello,caoyouxue')
}

// 洋葱模型   并且   异步编程（Promise async/await保持同步）
// 注册
app.use(async (ctx, next) => {
    // ctx 上下文（里面有request， response，各种自定义状态等）
    // next 根据请求信息继续执行‘下一个’中间件   next()会返回一个Promise对象，对象可能携带信息，也可能没有Promise{ undefined }
    // await 得到resolve(data)的结果， try/catch 一般得到reject(data)的结果；await也可以得到reject状态的结果但是一般await只用来等待成功返回
    // await 求值关键字，大多数情况对Promise对象解剖，也可以对表达式求值
    // await 阻塞当前线程，等地异步值，promise本身不是异步的，promise内部包涵的计算有可能是异步的，对资源的操作 异步：读写文件，发送http，操作数据库
    const a = await next()
    // console.log('2')
})
app.use(async (ctx, next) => {
    // axios库 返回Promise对象
 
    const axios = require('axios')
    // 异步编程
    const res = axios.get('http://7yue.pro')
    console.log(res)
    // console.log('4')
})


// api需要版本（接口一样，需求不一致）   根据业务变动，返回的需求不一样,不同版本api返回不同的数据
// v1 v2 v3 版本最好兼容（考虑到成本，最好三个版本）
// api 携带版本号（1路径里，2查询参数里，3header里）这里是版本号在路径里
// router.post/.put/.delete
// 第二个参数也是一个中间件，所以可以接收ctx/next //2

// app.use(book.routes()) 
// app.use(classic.routes())

